package com.yingcheng.numerology.framework.bazi.core.util;

import com.yingcheng.numerology.framework.bazi.core.enums.EarthlyBranchesEnum;
import com.yingcheng.numerology.framework.bazi.core.enums.HeavenlyStemsEnum;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;

public class BaziYearPillarCalculator {

    // 天干表（从甲子起始）
    private static final String[] HEAVENLY_STEMS = {
            "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"
    };

    // 地支表（从甲子起始）
    private static final String[] EARTHLY_BRANCHES = {
            "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"
    };

    // 立春时间映射表
    private static final Map<Integer, String> LICHUN_MAP = new HashMap<>();

    static {
        // 示例：2023年、2024年和2025年的立春时间
        LICHUN_MAP.put(2023, "2023-02-04T10:42:00");
        LICHUN_MAP.put(2024, "2024-02-04T16:22:00");
        LICHUN_MAP.put(2025, "2025-02-04T22:04:00");
    }

    /**
     * 计算年柱
     *
     * @param birthDateTime 出生日期时间
     * @return 年柱（天干+地支）
     */
    public static String calculateYearPillar(LocalDateTime birthDateTime) {
        // 获取出生年份
        int year = birthDateTime.getYear();
        LocalDateTime lichunDateTime = getLichunDateTime(year);

        // 判断是否属于农历上一年
        if (birthDateTime.isBefore(lichunDateTime)) {
            year--; // 立春之前属于上一年
        }

        // 天干地支索引计算（注意枚举索引从 1 开始）
        int heavenlyStemIndex = (year - 3) % 10; // 对应 HeavenlyStem 枚举的索引
        if (heavenlyStemIndex <= 0) {
            heavenlyStemIndex += 10;
        }
        int earthlyBranchIndex = (year - 3) % 12; // 对应 EarthlyBranch 枚举的索引

        if (earthlyBranchIndex <= 0) {
            earthlyBranchIndex += 12;
        }
        HeavenlyStemsEnum stem = HeavenlyStemsEnum.getByIndex(heavenlyStemIndex);
        EarthlyBranchesEnum branch = EarthlyBranchesEnum.getByIndex(earthlyBranchIndex);


        return stem.getName() + branch.getName() + "年";
//        return BaZiUtil.calculateYearHeavenlyStems(year,true);
    }

    /**
     * 获取指定年份的立春时间
     *
     * @param year 公历年份
     * @return 立春时间（LocalDateTime）
     */
    private static LocalDateTime getLichunDateTime(int year) {
        if (LICHUN_MAP.containsKey(year)) {
            return LocalDateTime.parse(LICHUN_MAP.get(year), DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        }
        throw new IllegalArgumentException("未定义该年份的立春时间: " + year);
    }

    // 主函数测试
    public static void main(String[] args) {
        // 示例日期：2023年2月3日（立春前，壬寅年）
        LocalDateTime birthDateTime = LocalDateTime.of(2023, 2, 3, 12, 0);
        String yearPillar = calculateYearPillar(birthDateTime);
        System.out.println("年柱: " + yearPillar); // 输出：壬寅年

        // 示例日期：2023年2月5日（立春后，癸卯年）
        birthDateTime = LocalDateTime.of(2023, 2, 5, 12, 0);
        yearPillar = calculateYearPillar(birthDateTime);
        System.out.println("年柱: " + yearPillar); // 输出：癸卯年

        // 示例日期：2025年2月3日（立春前，甲辰年）
        birthDateTime = LocalDateTime.of(2025, 2, 3, 12, 0);
        yearPillar = calculateYearPillar(birthDateTime);
        System.out.println("年柱: " + yearPillar); // 输出：甲辰年

        // 示例日期：2025年2月5日（立春后，乙巳年）
        birthDateTime = LocalDateTime.of(2025, 2, 5, 12, 0);
        yearPillar = calculateYearPillar(birthDateTime);
        System.out.println("年柱: " + yearPillar); // 输出：乙巳年
    }
}
